/**
 * TODO 修改描述
 * @description xx管理store
 * @author pan
 */
import {
  DEFAULT_CURRENT_PAGE,
  DEFAULT_PAGE_SIZE,
  DEFAULT_TOTAL,
  DEFAULT_TABLE_PAGINATION
} from '@/utils/GlobalConstant'
import AntdUtil from '@/utils/AntdUtil'
import WebApiUtil from '@/utils/WebApiUtil'
import webApi from '@/api/crud-demo-web-api/crud-demo-web-api'

export default {
  namespaced: true,
  state: {
    /**
     * 新增/编辑组件的表单是否处于提交状态
     */
    saveEditComponentFormSubmitting: false,
    /**
     * 表格数据加载状态. true表示加载中
     */
    tableDataLoading: false,
    /**
     * 表格展示数据
     */
    tableDataSource: [],
    /**
     * 表格分页数据
     */
    tablePagination: {
      // 当前页号
      current: DEFAULT_CURRENT_PAGE,
      // 每页记录数
      pageSize: DEFAULT_PAGE_SIZE,
      // 总记录数
      total: DEFAULT_TOTAL
    },
    /**
     * 某条记录的详细数据
     */
    detail: {}
  },
  mutations: {
    /**
     * 设置表格数据
     * @param state
     * @param pagination 分页条件
     * @param dataSource 展示数据
     * @constructor
     */
    SET_TABLE_DATA (state, { pagination, dataSource }) {
      state.tableDataSource = dataSource
      state.tablePagination = pagination
    },
    /**
     * 设置详细数据
     * @param state
     * @param detail 详细信息
     * @constructor
     */
    SET_DETAIL (state, detail) {
      state.detail = detail
    },
    /**
     * 设置表格数据加载状态
     * @param state
     * @param tableDataLoading
     * @constructor
     */
    SET_TABLE_DATA_LOADING (state, tableDataLoading) {
      state.tableDataLoading = tableDataLoading
    },
    /**
     * 设置新增/编辑组件的表单的提交状态
     * @param state
     * @param saveEditComponentFormSubmitting
     * @constructor
     */
    SET_SAVE_EDIT_COMPONENT_FORM_SUBMITTING (state, saveEditComponentFormSubmitting) {
      state.saveEditComponentFormSubmitting = saveEditComponentFormSubmitting
    }
  },
  actions: {
    /**
     * 新增数据
     * @param commit
     * @param state
     * @param data 待新增数据
     * @return {Promise<void>}
     */
    async add$ ({ commit, state }, data) {
      commit('SET_SAVE_EDIT_COMPONENT_FORM_SUBMITTING', true)
      try {
        await webApi.add$(data)
      } finally {
        commit('SET_SAVE_EDIT_COMPONENT_FORM_SUBMITTING', false)
      }
    },
    /**
     * 编辑数据
     * @param commit
     * @param state
     * @param data 待新增数据
     * @return {Promise<void>}
     */
    async edit$ ({ commit, state }, data) {
      commit('SET_SAVE_EDIT_COMPONENT_FORM_SUBMITTING', true)
      try {
        await webApi.edit$(data.id, data)
      } finally {
        commit('SET_SAVE_EDIT_COMPONENT_FORM_SUBMITTING', false)
      }
    },
    /**
     * 删除
     * @param commit
     * @param state
     * @param id
     * @return {Promise<void>}
     */
    async delete$ ({ commit, state }, id) {
      await webApi.delete$(id)
    },
    /**
     * 获取表格数据
     * @param commit
     * @param state
     * @param otherCdt 其它查询条件
     * @param pagination 分页条件
     * @return {Promise<void>}
     */
    async loadTableData$ ({ commit, state }, { otherCdt, pagination = DEFAULT_TABLE_PAGINATION }) {
      if (!state.tableDataLoading) {
        commit('SET_TABLE_DATA_LOADING', true)

        try {
          const res = await webApi.page$({
            page: AntdUtil.getAntdPaginationPageNO(pagination),
            size: AntdUtil.getAntdPaginationSize(pagination),
            kw: AntdUtil.getKw(otherCdt)
          })

          // 从web响应中提取实际的业务数据结果
          const bizData = WebApiUtil.extractResponseData(res)
          // 从业务数据结果中提取分页信息,并转换为antd的数据结构
          const realPagination = WebApiUtil.extractBackendPaginationAndConvertAntdPagination(bizData)
          // 从业务数据结果中提取分页结果集
          const dataSource = WebApiUtil.extractBackendPageData(bizData)

          // 将业务结果保存到store中
          commit('SET_TABLE_DATA', { pagination: realPagination, dataSource: dataSource })
        } finally {
          commit('SET_TABLE_DATA_LOADING', false)
        }
      }
    }
  }
}
